package cn.tedu.springboot01;

import cn.tedu.springboot01.dao.UserDao;
import cn.tedu.springboot01.entity.User;
import cn.tedu.springboot01.exception.UserNotFoundException;
import cn.tedu.springboot01.service.UserService;
import cn.tedu.springboot01.service.impl.UserServiceImpl;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.mockito.Mockito;

import java.util.Arrays;

import static org.junit.jupiter.api.Assertions.*;

/**
 * 测试业务层业务
 * 使用模拟框架进行单元测试
 * 脱离数据库且不依赖于Spring，去完成测试
 */
public class JunitTest03 {

    UserDao userDao;
    UserService userService;

    @BeforeEach
    void init() {
        userDao = Mockito.mock(UserDao.class);
        Mockito.when(userDao.findUserByName("Tom"))
                .thenReturn(new User(1, "Tom", "123", "ADMIN"));
        // 创建业务层
        UserServiceImpl userService = new UserServiceImpl();
        // 将数据层注入到业务层
        userService.setUserDao(userDao);
        this.userService = userService;
    }

    @Test
    void login() {
        // 测试登录业务是否正常通过
        User user = userService.login("Tom", "123");
        System.out.println(user);
        // 利用断言检测用户名是否都为tom，如果和预期一致就继续运行，不一致就出错
        assertEquals("Tom", user.getUsername());
        // assertThrows断言抛出的异常是否和预期的一致，如果一致，测试通过，不一致，测试不通过，需要修改业务逻辑
        assertThrows(UserNotFoundException.class, () -> {
            userService.login("jerry", "123");
        });
    }

    @Test
    void testAssert() {
        int[] arr1 = {1, 2, 3};
        int[] arr2 = {3, 1, 2};
        Arrays.sort(arr2); // 对数组进行排序
        System.out.println(Arrays.toString(arr1));
        System.out.println(Arrays.toString(arr2));
        assertArrayEquals(arr1, arr2, "数组相等");
    }

}
